System.Collections.Generic.HashSet<T> クラス

この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。

HashSet<T> クラスは、高パフォーマンスのセット操作を提供します。 セットは、重複する要素を含まないコレクションであり、その要素が特定の順序で存在しません。

HashSet<T> オブジェクトの容量は、オブジェクトが保持できる要素の数です。 HashSet<T> オブジェクトの容量は、要素がオブジェクトに追加されると自動的に増加します。

HashSet<T> クラスは、数学セットのモデルに基づいており、Dictionary<TKey,TValue>またはHashtable コレクションのキーにアクセスするのと同様のパフォーマンスの高いセット操作を提供します。 簡単に言うと、 HashSet<T> クラスは値のない Dictionary<TKey,TValue> コレクションと考えることができます。

HashSet<T> コレクションは並べ替えされておらず、重複する要素を含めることはできません。 順序または要素の重複がアプリケーションのパフォーマンスよりも重要な場合は、List<T> メソッドと共に Sort クラスを使用することを検討してください。

HashSet<T> には、セット加算 (和集合) やセット減算など、多くの数学セット演算が用意されています。 次の表に、指定された HashSet<T> 演算とその数学的な同等物を示します。

HashSet 操作 数学に相当する
UnionWith 和集合または集合の加算
IntersectWith 交差点
ExceptWith 減算を設定する
SymmetricExceptWith 対称差分

リストされているセット操作に加えて、 HashSet<T> クラスには、セットの等価性、セットの重複、およびセットが別のセットのサブセットかスーパーセットかを判断するためのメソッドも用意されています。

.NET Framework のみ:非常に大きなHashSet<T> オブジェクトの場合、enabled構成要素の<gcAllowVeryLargeObjects>属性をランタイム環境でtrueに設定することで、64 ビット システムで最大容量を 20 億要素に増やすことができます。

HashSet<T> クラスは ISet<T> インターフェイスを実装しています。

HashSet と LINQ 集合演算

LINQ は、DistinctインターフェイスまたはUnion インターフェイスを実装するすべてのデータ ソースに対するIntersectExceptIEnumerable、およびIQueryableセット操作にアクセスできます。 HashSet<T> は、より大きく堅牢なセット操作のコレクションを提供します。 たとえば、 HashSet<T> では、 IsSubsetOfIsSupersetOfなどの比較が提供されます。

LINQ セット操作と HashSet<T> 操作の主な違いは、LINQ セット操作が常に新しい IEnumerable<T> コレクションを返すのに対し、 HashSet<T> 同等のメソッドは現在のコレクションを変更することです。

通常、新しいセットを作成する必要がある場合、またはアプリケーションが指定されたセット操作にのみアクセスする必要がある場合は、 IEnumerable<T> コレクションまたは配列に対して LINQ セット操作を使用するだけで十分です。 ただし、アプリケーションが追加のセット操作にアクセスする必要がある場合、または新しいコレクションを作成するのが望ましくない場合や必要な場合は、 HashSet<T> クラスを使用します。

次の表は、 HashSet<T> 操作とその同等の LINQ セット操作を示しています。

HashSet 操作 LINQ に相当する
UnionWith Union
IntersectWith Intersect
ExceptWith Except
指定されていません。 Distinct
SymmetricExceptWith 指定されていません。
Overlaps 指定されていません。
IsSubsetOf 指定されていません。
IsProperSubsetOf 指定されていません。
IsSupersetOf 指定されていません。
IsProperSupersetOf 指定されていません。
SetEquals 指定されていません。